﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.ServiceModel.DomainServices.Tools.TextTemplate.CSharpGenerators;

namespace HCFB.UFO.RIAServices.Web.Generators
{
	class UfoEntityGenerator : CSharpEntityGenerator
	{
		private const string CtorBegin = "// ctor";
		private const string CtorEnd = "// end of ctor";

		protected override void GenerateConstructor()
		{
			// помечаем конструктор, чтобы потом его заменить
			this.WriteLine(CtorBegin);
			base.GenerateConstructor();
			this.WriteLine(CtorEnd);
		}
/*
		public override string TransformText()
		{
			// подставляем наш класс в качестве базового класса для всех клиентских сущностей
			string text = base.TransformText().Replace
			(
				" : System.ServiceModel.DomainServices.Client.Entity",
				" : HCFB.UFO.RIAServices.Web.UfoClientEntityBase"
			);

			if (text.Contains("public System.Guid ParentKey")) // подставляем конструктор с идентификатором родительской сущности
			{
				text = InsertParentKeyConstructor(text);
			}
			else if (text.Contains("public System.Guid Key")) // подставляем автогенерацию Guid-а
			{
				text = InsertKeyGeneration(text);
			}


			return text;
		}
*/
		private string InsertKeyGeneration(string text)
		{
			int ctorBeginIndex = text.IndexOf(CtorBegin);
			int ctorEndIndex = text.IndexOf(CtorEnd);
			string oldCtor = text.Substring(ctorBeginIndex, ctorEndIndex + CtorEnd.Length - ctorBeginIndex);

			string newCtor = oldCtor.Replace("this.OnCreated();", "this._key = System.Guid.NewGuid(); this.OnCreated();");

			return text.Replace(oldCtor, newCtor);
		}

		private string InsertParentKeyConstructor(string text)
		{
			int ctorBeginIndex = text.IndexOf(CtorBegin);
			int ctorEndIndex = text.IndexOf(CtorEnd);
			string oldCtor = text.Substring(ctorBeginIndex, ctorEndIndex + CtorEnd.Length - ctorBeginIndex);

			string newCtor = oldCtor.Replace("this.OnCreated();", "this._key = System.Guid.NewGuid( ); this._parentKey = parentKey; this.OnCreated( );");
			newCtor = newCtor.Replace("()", "(System.Guid parentKey)");

			return text.Replace(oldCtor, newCtor);
		}

	}
}
